package com.teamwings.modules.page.mapper;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.teamwings.ctrls.entity.DatabaseTableWithColumns;
import com.teamwings.modules.code.entity.FormTableCode;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface PageMapper {

    Map<String, Object> selectOneByFormIdAndId(@Param("tableName") String tableName, @Param("id") String id);

    void saveByFormId(
            @Param("tableName") String tableName,
            @Param("formData") Map<String, String> formData
    );

    void deleteByFormIdAndId(@Param("tableName") String tableName, @Param("id") String id, @Param("del") Integer delFlag);

    int updateByFormId(@Param("tableName") String tableName, @Param("formData") Map<String, String> formData);

    @Deprecated
    IPage<Map<String, String>> selectPage(
            Page<?> page,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper
    );

    // 获取分页需要的records
    List<Map<String, String>> selectRecords(
            @Param("tableName") String tableName,
            @Param("pageIndex") Long pageIndex,
            @Param("pageSize") Long pageSize,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper
    );
    // 获取分页需要的records，与前者增加字段
    List<Map<String, String>> selectRecordsFields(
            @Param("tableName") String tableName,
            @Param("fields") String fields,
            @Param("pageIndex") Long pageIndex,
            @Param("pageSize") Long pageSize,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper
    );

    // 获取分页需要的records
    Integer selectCountByTableName(
            @Param("tableName") String tableName,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper
    );

    // 获取分页需要的records
    Integer selectCountBySql(
            @Param("sql") String sql,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper,
            @Param("hasWhere") Boolean hasWhere
    );

    List<Map<String, String>> selectAll(
            @Param("tableName") String tableName,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper
    );

    List<Map> executeSql(@Param("sql") String sql);

    List<String> getColumnByTableName(@Param("tableName") String tableName);

    // 获取分页需要的records，与前者增加字段
    List<Map<String, String>> selectRecordsBySql(
            @Param("sql") String sql,
            @Param("pageIndex") Long pageIndex,
            @Param("pageSize") Long pageSize,
            @Param(Constants.WRAPPER) Wrapper<?> wrapper,
            @Param("hasWhere") Boolean hasWhere
    );

    String getTableCodeByFormId(@Param("formId") String formId);

    List<Map> selectFields(@Param("fields") String fields, @Param("tableName") String tableName);

    List<Map> selectFields2(@Param("fields") String fields, @Param("tableName") String tableName, @Param(Constants.WRAPPER) Wrapper<?> wrapper);

    List<Map<String, Object>> selectBySql(@Param("sql") String sql, @Param(Constants.WRAPPER) QueryWrapper<?> queryWrapper, @Param("hasWhere") Boolean hasWhere);

    List<Map<String, Object>> selectAll2(@Param("tableName") String tableName, @Param(Constants.WRAPPER) Wrapper<?> wrapper);

    /**
     *
     * @param tableName
     * @param field 用户需要自己保证该字段不会被sql注入
     * @param value
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    Integer hasValue(@Param("tableName") String tableName, @Param("id") String id, @Param("field") String field, @Param("value") String value);

    DatabaseTableWithColumns getTableWithColumns(@Param("tableName") String tableName);

    FormTableCode getLatestOneByFormId(@Param("formId") String formId);
}
